home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
041-050
/
amok45
/
crypto
/
tauscher.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
4KB
|
197 lines
(*-----------------------------------------------------------------------------
:Program. Tauscher
:Contents. kodiert eine Beliebige Datei durch Vertauschen der Bytes.
:Author. Klemens Meyer
:Address. Sievershauser Str.3 3155 Edemissen/Oelerse
:History. V 1.0 19.06.89 [Meyer]
:Copyright. Public Domain
:Language. MODULA 2
:Translator. M2Amiga V3.2d A+L
:Usage. vom CLI: Tauscher <FILE> <CODE>
-----------------------------------------------------------------------------*)
MODULE Tauscher;
FROM SYSTEM IMPORT
ADR;
FROM Arts IMPORT
TermProcedure,Terminate;
FROM FileSystem IMPORT
File,Response,
Lookup,Close,
ReadBytes,WriteBytes;
FROM Arguments IMPORT
NumArgs,GetArg;
FROM InOut IMPORT
WriteString,WriteLn;
FROM Str IMPORT
Compare,Concat,Length;
TYPE String = ARRAY [0..80] OF CHAR;
Block = ARRAY [0..10] OF CHAR;
tProc = PROCEDURE (VAR Block,String);
VAR rfile,wfile : File;
code : String;
block : Block;
Tausch : tProc;
PROCEDURE Swap (VAR x,y : CHAR);
(* :Input. zwei CHAR-Variable
:Semantic. Vertauscht die Inhalte beider Variablen. *)
VAR d : CHAR;
BEGIN
d:=x;x:=y;y:=d;
END Swap;
PROCEDURE Hin (VAR b : Block;c : String);
(* :Input. ein 10 Zeichen langes Array aus der Klartextdatei
:Input. Codewort max. 80 Zeichen lang
:Semantic. Vertauscht die Bytes des Blocks b untereinander *)
VAR d : CHAR;
i,l,x,y : INTEGER;
BEGIN
l:=Length(c);
l:=l-(l MOD 2);
FOR i:=0 TO l BY 2 DO
x:=INTEGER(c[i]) MOD 10;
y:=INTEGER(c[i+1]) MOD 10;
Swap(b[x],b[y]);
END; (* FOR *)
END Hin;
PROCEDURE Her (VAR b : Block;c : String);
(* :Input. siehe Hin
:Semantic. macht die Vertauschung aus Procedure Hin rückgängig *)
VAR d : CHAR;
i,l,x,y : INTEGER;
BEGIN
l:=Length(c);
l:=l-(l MOD 2);
FOR i:=l TO 0 BY -2 DO
x:=INTEGER(c[i+1]) MOD 10;
y:=INTEGER(c[i]) MOD 10;
Swap(b[x],b[y]);
END; (* FOR *)
END Her;
PROCEDURE CloseAll;
(* :Semantic. Abschlußprocedure. Schließt die geöffneten Files *)
BEGIN
Close(rfile);
Close(wfile);
END CloseAll;
PROCEDURE Extension (VAR str,ext : String);
(* :Input. String mit Filenamen und leerer String für Extension
:Semantic. ermittelt alle zeichen nach dem letzten Punkt im Filnamen *)
VAR i,j : LONGCARD;
BEGIN
i:=Length(str);
WHILE (str[i]#".") AND (i>0) DO
DEC(i);
END; (* WHILE *)
FOR j:=0 TO Length(str)-i DO
ext[j]:=str[j+i];
END; (* FOR *)
str[i]:=CHR(0);
END Extension;
PROCEDURE Init;
(* :Semantic. öffnet alle Dateien und weist die Entschlüsselugs-
:Semantic. procedure zu, wenn die Extension des Files ".code" lautet.
:Semantic. Sonst die Verschlüsselungsprocedure *)
VAR fname,ext : String;
len : INTEGER;
BEGIN
IF NumArgs()#2 THEN
WriteString("Usage: Tauscher <FILE> <CODE>");WriteLn;
Terminate(0);
END; (* IF *)
TermProcedure(CloseAll);
GetArg(1,fname,len);
WriteString("Klartextfile: ");WriteString(fname);
Lookup(rfile,fname,4096,FALSE);
IF rfile.res#done THEN
WriteString(" konnte nicht geöffnet werden!");WriteLn;
Terminate(0);
END; (* IF *)
WriteLn;
Extension(fname,ext);
IF Compare(ext,".code")=0 THEN
Tausch:=Her;
ELSE
Tausch:=Hin;
Concat (fname,ext);
Concat (fname,".code");
END; (* IF *)
WriteString("Codefile: ");
WriteString(fname);
Lookup(wfile,fname,4096,TRUE);
IF wfile.res#done THEN
WriteString(" konnte nicht geöffnet werden!");WriteLn;
Terminate(0);
END; (* IF *)
WriteLn;
GetArg (2,code,len);
END Init;
PROCEDURE ReadBlock (VAR b : Block);
(* :Semantic. Liest einen 10-Zeichen langen Block in b ein *)
VAR act,i : LONGINT;
BEGIN
ReadBytes(rfile,ADR(b),10,act);
IF act<10 THEN
FOR i:=act TO 9 DO
b[i]:=CHR(32);
END; (* FOR *)
END; (* IF *)
b[10]:=CHR(0);
END ReadBlock;
PROCEDURE WriteBlock (VAR b : Block);
(* :Semantic. schreibt einen 10 Zeichen langen Block aus b *)
VAR act : LONGINT;
BEGIN
WriteBytes(wfile,ADR(b),10,act);
END WriteBlock;
BEGIN (* MAIN *)
Init;
LOOP
ReadBlock (block);
IF rfile.eof THEN EXIT END;
Tausch (block,code);
WriteString (block);
WriteBlock (block);
END; (* LOOP *)
WriteLn;
WriteString ("Tausch beendet!");WriteLn;
END Tauscher.